//The count-and-say sequence is the sequence of integers with the first five ter
//ms as following:
//
//
//1.     1
//2.     11
//3.     21
//4.     1211
//5.     111221
//
//
// 1 is read off as "one 1" or 11.
//11 is read off as "two 1s" or 21.
//21 is read off as "one 2, then one 1" or 1211.
//
// Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-s
//ay sequence. You can do so recursively, in other words from the previous member
//read off the digits, counting the number of digits in groups of the same digit.
//
//
// Note: Each term of the sequence of integers will be represented as a string.
//
//
//
//
// Example 1:
//
//
//Input: 1
//Output: "1"
//Explanation: This is the base case.
//
//
// Example 2:
//
//
//Input: 4
//Output: "1211"
//Explanation: For n = 3 the term was "21" in which we have two groups "2" and "
//1", "2" can be read as "12" which means frequency = 1 and value = 2, the same wa
//y "1" is read as "11", so the answer is the concatenation of "12" and "11" which
// is "1211".
//
// Related Topics 字符串
// 👍 506 👎 0


package leetcode.editor.cn;

public class P38CountAndSay {
    public static void main(String[] args) {
        Solution solution = new P38CountAndSay().new Solution();
        //TO TEST
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String countAndSay(int n) {
            String c = "1";
            for (int i = 1; i < n; i++) {
                c =  say(c);
            }
            return c;
        }

        private String say(String src) {
            StringBuilder sb = new StringBuilder();
            int pre = 0;
            int i = 0;
            while (i < src.length()) {
                if (src.charAt(pre) != src.charAt(i)) {
                    sb.append(i - pre);
                    sb.append(src.charAt(pre));
                    pre = i;
                }
                i++;
            }
            sb.append(i - pre);
            sb.append(src.charAt(pre));
            return sb.toString();
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
